
package com.softWang.common.tenent.db;

import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.softWang.common.tenent.context.TenantContextHolder;
import com.softWang.common.utils.SecurityUtils;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;

import java.util.*;

/**
 * 基于 MyBatis Plus 多租户的功能，实现 DB 层面的多租户的功能
 */

public class TenantDatabaseInterceptor implements TenantLineHandler {

    private final Set<String> ignoreTables = new HashSet<>();
    private static final String[] tableNames = {"file_manage","job_log","job_manage","system_area","system_dict_data","system_dict_type",
        "system_menu","system_parameter","system_tenant","system_tenant_menu"};

    public TenantDatabaseInterceptor() {
        // 不同 DB 下，大小写的习惯不同，所以需要都添加进去
        Arrays.stream(tableNames).forEach(table -> {
            ignoreTables.add(table.toLowerCase());
            ignoreTables.add(table.toUpperCase());
        });
        // 在 OracleKeyGenerator 中，生成主键时，会查询这个表，查询这个表后，会自动拼接 TENANT_ID 导致报错
        ignoreTables.add("DUAL");
        ignoreTables.add("dual");
    }

    @Override
    public Expression getTenantId() {
        return new LongValue(TenantContextHolder.getRequiredTenantId());
    }

    @Override
    public boolean ignoreTable(String tableName) {
        return TenantContextHolder.isIgnore() // 情况一，全局忽略多租户
            || ignoreTables.contains(tableName) // 情况二，忽略多租户的表
            || (SecurityUtils.getLoginUser() == null); // 情况三，未登录用户，忽略多租户
    }

}
